import random
import time
import sys
import os

# 将项目根目录添加到Python路径
sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), '..')))

from wxauto import WeChat   # 导入微信模块
import pythoncom            # 导入pythoncom模块
from core.logger import get_logger  # 导入日志模块

# 创建模块特定的日志记录器
logger = get_logger("SUD_GetMessage")

# 全局变量微信实例
_wx_instance = None

# 初始化微信实例
def _init_wechat():
    """
    初始化微信实例，确保全局唯一
    
    返回:
        WeChat: 初始化后的微信实例
    """
    # 全局变量微信实例
    global _wx_instance

    # 初始化COM环境
    logger.info("初始化COM环境")
    pythoncom.CoInitialize()                    
    
    # 如果微信实例为空，则初始化微信实例
    if _wx_instance is None:
        logger.info("创建新的微信实例")
        _wx_instance = WeChat()                
    else:
        logger.debug("使用已存在的微信实例")

    return _wx_instance


def load_more_messages(max_iterations=3, min_delay=1.0, max_delay=3.0):
    """
    循环调用LoadMoreMessage，加载更多消息，并添加随机延时
    
    Args:
        max_iterations: 最大循环次数，默认为3
        min_delay: 最小延时时间(秒)，默认为1.0
        max_delay: 最大延时时间(秒)，默认为3.0
        
    Returns:
        int: 成功加载的次数
    """
    
    # 初始化微信实例
    wx = _init_wechat()

    # 加载更多消息的次数,初始化
    load_count = 0
    
    logger.info(f"开始加载更多消息，最大迭代次数: {max_iterations}")
    
    # 循环调用LoadMoreMessage，加载更多消息
    for i in range(max_iterations):
        logger.info(f"第{i+1}次加载更多消息")
        
        # 加载更多消息
        result = wx.LoadMoreMessage() 

        # 检查状态是否为失败，如果是则打印消息并退出循环
        if result.get('status') == '失败':
            logger.info(f"加载完成: {result.get('message')}")
            break
        else:
            # 只有在成功时才增加计数
            load_count += 1
            logger.debug(f"成功加载第{i+1}次消息")
            
            # 如果不是最后一次加载，则添加随机延时
            if i < max_iterations - 1:
                delay_time = random.uniform(min_delay, max_delay)
                logger.debug(f"等待 {delay_time:.2f} 秒...")
                time.sleep(delay_time)
    
    logger.info(f"共成功加载 {load_count} 次消息")
    return load_count


def get_chat_messages_in_deepseek_format():
    """
    获取微信当前聊天窗口的所有消息，并将它转化为Deepseek的message格式
    
        
    Returns:
        tuple: (friend_name, messages_list)
            - friend_name: 当前聊天的好友名称
            - messages_list: 转换为Deepseek格式的消息列表
    """
    logger.info("开始获取并转换聊天消息")

    # 初始化微信实例
    wx = _init_wechat()

    # 获取微信当前聊天窗口的所有消息
    messages = wx.GetAllMessage()
    logger.info(f"获取到 {len(messages)} 条原始消息")

    # 初始化消息列表
    messages_list = []

    # 初始化好友名称
    friend_name = ""
    
    for message in messages:
        # 判断消息属性是self还是friend，跳过其他类型
        if message.attr == 'self':
            logger.debug(f"处理自己发送的消息: {message.content[:20]}...")
            
            # 将消息内容添加到messages_list中,role为system
            messages_list.append({"role": "system", "content": message.content})
            
        elif message.attr == 'friend':
            logger.debug(f"处理好友 {message.sender} 发送的消息: {message.content[:20]}...")

            # 获取好友名称
            friend_name = message.sender
            
            # 将消息内容添加到messages_list中,role为user
            messages_list.append({"role": "user", "content": message.content})
        else:
            # 跳过其他类型的消息
            logger.debug(f"跳过其他类型的消息: {message.attr}")
            continue
    
    logger.info(f"消息转换完成，好友: {friend_name}，共 {len(messages_list)} 条格式化消息")
    return friend_name, messages_list


def process_wechat_messages(load_iterations=3):
    """
    完整处理微信消息的函数：加载更多消息、获取格式化的聊天记录
    
    Args:
        load_iterations: 尝试加载更多消息的次数，默认为3
        
    Returns:
        tuple: (friend_name, messages_list)
            - friend_name: 当前聊天的好友名称
            - messages_list: 转换为Deepseek格式的消息列表
    """
    logger.info(f"开始处理微信消息，加载迭代次数: {load_iterations}")
    
    # 初始化微信实例
    wx = _init_wechat()

    # 调用加载更多消息的函数
    loaded_count = load_more_messages(load_iterations)
    logger.info(f"成功加载了 {loaded_count} 次消息")

    # 获取消息并转换为Deepseek格式
    friend_name, messages_list = get_chat_messages_in_deepseek_format()
    
    logger.info(f"消息处理完成，好友: {friend_name}，消息数量: {len(messages_list)}")
    return friend_name, messages_list


if __name__ == "__main__":
    logger.info("开始执行SUD_GetMessage主程序")
    
    # 调用处理微信消息的函数，默认加载3次消息
    load_iterations=3
    friend_name, messages = process_wechat_messages(load_iterations)
    
    logger.info("SUD_GetMessage主程序执行完毕")
    




